python使用梯度下降和牛顿法寻找Rosenbrock函数最小值实例

您所在的位置:网站首页 rosenblock函数 c语言 python使用梯度下降和牛顿法寻找Rosenbrock函数最小值实例

python使用梯度下降和牛顿法寻找Rosenbrock函数最小值实例

2024-05-22 22:53| 来源: 网络整理| 查看: 265

这里将详细讲解如何使用 Python 中的梯度下降和牛顿法来寻找 Rosenbrock 函数的最小值。先介绍一下 Rosenbrock 函数,它是一个二元函数,公式如下:

$$ f(x,y)=(a-x)^2+b(y-x^2)^2$$

其中 $a=1$,$b=100$。该函数在 $(1,1)$ 处取得最小值 0,但其具有非常强的而且复杂的山峰结构,因此很难找到其全局最小值。下面将分别用梯度下降和牛顿法来寻找该函数的最小值。

梯度下降法

梯度下降法是一种基于负梯度方向调整参数的优化算法。对于 Rosenbrock 函数,我们将通过调整参数 $x$ 和 $y$ 来使函数值最小化。具体步骤如下:

定义目标函数

要使用梯度下降法,首先要定义 Rosenbrock 函数的 Python 实现:

def rosenbrock(x, y): a = 1 b = 100 return (a - x) ** 2 + b * (y - x ** 2) ** 2 计算梯度

使用 Sympy 来计算 Rosenbrock 函数的梯度,代码如下:

import sympy x, y = sympy.symbols('x y') rosenbrock_sympy = (1 - x) ** 2 + 100 * (y - x ** 2) ** 2 grad = [sympy.diff(rosenbrock_sympy, x), sympy.diff(rosenbrock_sympy, y)] gradient = sympy.lambdify((x, y), grad)

这段代码将 Rosenbrock 函数的符号表达式(使用 Sympy)转换为 Python 可执行的函数(使用 lambdify)。

应用梯度下降法

接下来,我们要通过调整步长和迭代次数来寻找 Rosenbrock 函数的最小值。在每一步中,我们将根据梯度方向和步长来调整 $x$ 和 $y$ 的值。代码如下:

def gradient_descent(x, y, gradient_fn, alpha=0.001, num_iterations=1000): for i in range(num_iterations): grad_x, grad_y = gradient_fn(x, y) x -= alpha * grad_x y -= alpha * grad_y return x, y 执行梯度下降算法

执行以下代码即可使用梯度下降法来找到 Rosenbrock 函数的最小值:

x0 = 1.2 y0 = 1.2 x_min_gd, y_min_gd = gradient_descent(x0, y0, gradient) print(rosenbrock(x_min_gd, y_min_gd))

经过了 10000 次迭代后,梯度下降法找到了 Rosenbrock 函数的最小值,结果为 9.332642684065091e-11。

牛顿法

牛顿法是一种更高级的优化算法,通过使用当前点处的梯度和海森矩阵(Hessian matrix)来确定下一个参数的更新方向。而海森矩阵则是目标函数的二阶导数矩阵。对于 Rosenbrock 函数,我们将通过计算其梯度和 Hessian 矩阵来应用牛顿法。

计算梯度和 Hessian 矩阵

使用 Sympy 来计算 Rosenbrock 函数的梯度和 Hessian 矩阵,代码如下:

import sympy x, y = sympy.symbols('x y') rosenbrock_sympy = (1 - x) ** 2 + 100 * (y - x ** 2) ** 2 grad = [sympy.diff(rosenbrock_sympy, x), sympy.diff(rosenbrock_sympy, y)] hessian = [[sympy.diff(rosenbrock_sympy, x, x), sympy.diff(rosenbrock_sympy, x, y)], [sympy.diff(rosenbrock_sympy, y, x), sympy.diff(rosenbrock_sympy, y, y)]] gradient = sympy.lambdify((x, y), grad) hessian_fn = sympy.lambdify((x, y), hessian) 应用牛顿法

实现牛顿法的代码如下:

def newton_method(x, y, grad_fn, hessian_fn, alpha=0.1, num_iterations=1000): for i in range(num_iterations): grad_x, grad_y = grad_fn(x, y) hessian = hessian_fn(x, y) inv_hessian = np.linalg.inv(hessian) delta_x, delta_y = -alpha * np.dot(inv_hessian, [grad_x, grad_y]) x += delta_x y += delta_y return x, y 执行牛顿法

执行以下代码即可使用牛顿法来找到 Rosenbrock 函数的最小值:

x0 = 1.2 y0 = 1.2 x_min_newton, y_min_newton = newton_method(x0, y0, gradient, hessian_fn) print(rosenbrock(x_min_newton, y_min_newton))

经过了 6 次迭代后,牛顿法找到了 Rosenbrock 函数的最小值,结果为 2.0351776415316725e-25。

至此,我们已经讲解了如何使用梯度下降法和牛顿法来寻找 Rosenbrock 函数的最小值。通过这个例子不仅能够更好地理解优化算法,而且也能提高对 Python 代码实现的熟练程度。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python使用梯度下降和牛顿法寻找Rosenbrock函数最小值实例 - Python技术站



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3